





<!DOCTYPE html>
<html class="writer-html5" lang="zh-CN" >
<head>
  <meta charset="utf-8">
  
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  
  <title>Autotuning with micro TVM &mdash; tvm 0.8.dev1982 文档</title>
  

  
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
  <link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" />
  <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
  <link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" />
  <link rel="stylesheet" href="../../_static/gallery.css" type="text/css" />
  <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
  <link rel="stylesheet" href="../../_static/css/tlcpack_theme.css" type="text/css" />

  
  
    <link rel="shortcut icon" href="../../_static/tvm-logo-square.png"/>
  

  
  
  
  
    
      <script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
        <script data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js"></script>
        <script src="../../_static/jquery.js"></script>
        <script src="../../_static/underscore.js"></script>
        <script src="../../_static/doctools.js"></script>
        <script src="../../_static/translations.js"></script>
    
    <script type="text/javascript" src="../../_static/js/theme.js"></script>

    
    <script type="text/javascript" src="../../_static/js/tlcpack_theme.js"></script>
    <link rel="index" title="索引" href="../../genindex.html" />
    <link rel="search" title="搜索" href="../../search.html" />
    <link rel="next" title="microTVM 虚拟机" href="micro_reference_vm.html" />
    <link rel="prev" title="Work With microTVM" href="index.html" /> 
</head>

<body class="wy-body-for-nav">

   
  <div class="wy-grid-for-nav">
    
    
<header class="header">
    <div class="innercontainer">
      <div class="headerInner d-flex justify-content-between align-items-center">
          <div class="headerLogo">
               <a href="https://tvm.apache.org/"><img src=https://tvm.apache.org/assets/images/logo.svg alt="logo"></a>
          </div>

          <div id="headMenu" class="headerNav">
            <button type="button" id="closeHeadMenu" class="navCloseBtn"><img src="../../_static/img/close-icon.svg" alt="Close"></button>
             <ul class="nav">
                <li class="nav-item">
                   <a class="nav-link" href=https://tvm.apache.org/community>Community</a>
                </li>
                <li class="nav-item">
                   <a class="nav-link" href=https://tvm.apache.org/download>Download</a>
                </li>
                <li class="nav-item">
                   <a class="nav-link" href=https://tvm.apache.org/vta>VTA</a>
                </li>
                <li class="nav-item">
                   <a class="nav-link" href=https://tvm.apache.org/blog>Blog</a>
                </li>
                <li class="nav-item">
                   <a class="nav-link" href=https://tvm.apache.org/docs>Docs</a>
                </li>
                <li class="nav-item">
                   <a class="nav-link" href=https://tvmconf.org>Conference</a>
                </li>
                <li class="nav-item">
                   <a class="nav-link" href=https://github.com/apache/tvm/>Github</a>
                </li>
                <li class="nav-item">
                   <a class="nav-link" href=https://tvmchinese.github.io/declaration_zh_CN.html>About-Translators</a>
                </li>
             </ul>
               <div class="responsivetlcdropdown">
                 <button type="button" class="btn-link">
                   ASF
                 </button>
                 <ul>
                     <li>
                       <a href=https://apache.org/>Apache Homepage</a>
                     </li>
                     <li>
                       <a href=https://www.apache.org/licenses/>License</a>
                     </li>
                     <li>
                       <a href=https://www.apache.org/foundation/sponsorship.html>Sponsorship</a>
                     </li>
                     <li>
                       <a href=https://www.apache.org/security/>Security</a>
                     </li>
                     <li>
                       <a href=https://www.apache.org/foundation/thanks.html>Thanks</a>
                     </li>
                     <li>
                       <a href=https://www.apache.org/events/current-event>Events</a>
                     </li>
                     <li>
                       <a href=https://www.zhihu.com/column/c_1429578595417563136>Zhihu</a>
                     </li>
                 </ul>
               </div>
          </div>
            <div class="responsiveMenuIcon">
              <button type="button" id="menuBtn" class="btn-menu"><img src="../../_static/img/menu-icon.svg" alt="Menu Icon"></button>
            </div>

            <div class="tlcDropdown">
              <div class="dropdown">
                <button type="button" class="btn-link dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                  ASF
                </button>
                <div class="dropdown-menu dropdown-menu-right">
                  <ul>
                     <li>
                       <a href=https://apache.org/>Apache Homepage</a>
                     </li>
                     <li>
                       <a href=https://www.apache.org/licenses/>License</a>
                     </li>
                     <li>
                       <a href=https://www.apache.org/foundation/sponsorship.html>Sponsorship</a>
                     </li>
                     <li>
                       <a href=https://www.apache.org/security/>Security</a>
                     </li>
                     <li>
                       <a href=https://www.apache.org/foundation/thanks.html>Thanks</a>
                     </li>
                     <li>
                       <a href=https://www.apache.org/events/current-event>Events</a>
                     </li>
                     <li>
                       <a href=https://www.zhihu.com/column/c_1429578595417563136>Zhihu</a>
                     </li>
                  </ul>
                </div>
              </div>
          </div>
       </div>
    </div>
 </header>
 
    <nav data-toggle="wy-nav-shift" class="wy-nav-side fixed">
      <div class="wy-side-scroll">
        <div class="wy-side-nav-search" >
          

          
            <a href="../../index.html">
          

          
            
            <img src="../../_static/tvm-logo-small.png" class="logo" alt="Logo"/>
          
          </a>

          
            
            
                <div class="version">
                  0.8.dev1982
                </div>
            
          

          
<div role="search">
  <form id="rtd-search-form" class="wy-form" action="../../search.html" method="get">
    <input type="text" name="q" placeholder="Search docs" />
    <input type="hidden" name="check_keywords" value="yes" />
    <input type="hidden" name="area" value="default" />
  </form>
</div>

          
        </div>

        
        <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
          
            
            
              
            
            
              <p class="caption" role="heading"><span class="caption-text">如何开始</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../install/index.html">安装 TVM</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../contribute/index.html">贡献者指南</a></li>
</ul>
<p class="caption" role="heading"><span class="caption-text">用户引导</span></p>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../../tutorial/index.html">User Tutorial</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="../index.html">How To Guides</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="../compile_models/index.html">编译深度学习模型</a></li>
<li class="toctree-l2"><a class="reference internal" href="../deploy/index.html">TVM 部署模型和集成</a></li>
<li class="toctree-l2"><a class="reference internal" href="../work_with_relay/index.html">Work With Relay</a></li>
<li class="toctree-l2"><a class="reference internal" href="../work_with_schedules/index.html">Work With Tensor Expression and Schedules</a></li>
<li class="toctree-l2"><a class="reference internal" href="../optimize_operators/index.html">优化张量算子</a></li>
<li class="toctree-l2"><a class="reference internal" href="../tune_with_autotvm/index.html">Auto-Tune with Templates and AutoTVM</a></li>
<li class="toctree-l2"><a class="reference internal" href="../tune_with_autoscheduler/index.html">Use AutoScheduler for Template-Free Scheduling</a></li>
<li class="toctree-l2 current"><a class="reference internal" href="index.html">Work With microTVM</a><ul class="current">
<li class="toctree-l3 current"><a class="current reference internal" href="#">Autotuning with micro TVM</a><ul>
<li class="toctree-l4"><a class="reference internal" href="#defining-the-model">Defining the model</a></li>
<li class="toctree-l4"><a class="reference internal" href="#defining-the-target">Defining the target #</a></li>
<li class="toctree-l4"><a class="reference internal" href="#extracting-tuning-tasks">Extracting tuning tasks</a></li>
<li class="toctree-l4"><a class="reference internal" href="#configuring-microtvm">Configuring microTVM</a></li>
<li class="toctree-l4"><a class="reference internal" href="#timing-the-untuned-program">Timing the untuned program</a></li>
<li class="toctree-l4"><a class="reference internal" href="#timing-the-tuned-program">Timing the tuned program</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="micro_reference_vm.html">microTVM 虚拟机</a></li>
<li class="toctree-l3"><a class="reference internal" href="micro_tflite.html">使用microTVM部署TFLite模型</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../extend_tvm/index.html">Extend TVM</a></li>
<li class="toctree-l2"><a class="reference internal" href="../profile/index.html">Profile Models</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../errors.html">Handle TVM Errors</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../faq.html">常见提问</a></li>
</ul>
</li>
</ul>
<p class="caption" role="heading"><span class="caption-text">开发者引导</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../dev/tutorial/index.html">Developer Tutorial</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../dev/how_to/how_to.html">开发者指南</a></li>
</ul>
<p class="caption" role="heading"><span class="caption-text">架构指南</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../arch/index.html">Design and Architecture</a></li>
</ul>
<p class="caption" role="heading"><span class="caption-text">主题引导</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../topic/microtvm/index.html">microTVM：裸机使用TVM</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../topic/vta/index.html">VTA: Versatile Tensor Accelerator</a></li>
</ul>
<p class="caption" role="heading"><span class="caption-text">参考指南</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../reference/langref/index.html">语言参考</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../reference/api/python/index.html">Python API</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../reference/api/links.html">Other APIs</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../reference/publications.html">Publications</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../genindex.html">索引</a></li>
</ul>

            
          
        </div>
        
      </div>
    </nav>

    <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
      
      <nav class="wy-nav-top" aria-label="top navigation" data-toggle="wy-nav-top">
        
            <div class="togglemenu">

            </div>
            <div class="nav-content">
              <!-- tvm -->
              Table of content
            </div>
        
      </nav>


      <div class="wy-nav-content">
        
        <div class="rst-content">
        

          




















<div role="navigation" aria-label="breadcrumbs navigation">

  <ul class="wy-breadcrumbs">
    
      <li><a href="../../index.html">Docs</a> <span class="br-arrow">></span></li>
        
          <li><a href="../index.html">How To Guides</a> <span class="br-arrow">></span></li>
        
          <li><a href="index.html">Work With microTVM</a> <span class="br-arrow">></span></li>
        
      <li>Autotuning with micro TVM</li>
    
    
      <li class="wy-breadcrumbs-aside">
        
            
            <a href="../../_sources/how_to/work_with_microtvm/micro_autotune.rst.txt" rel="nofollow"> <img src="../../_static//img/source.svg" alt="viewsource"/></a>
          
        
      </li>
    
  </ul>

  
  <hr/>
</div>
          <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
           <div itemprop="articleBody">
            
  <div class="sphx-glr-download-link-note admonition note">
<p class="admonition-title">注解</p>
<p>Click <a class="reference internal" href="#sphx-glr-download-how-to-work-with-microtvm-micro-autotune-py"><span class="std std-ref">here</span></a> to download the full example code</p>
</div>
<div class="sphx-glr-example-title section" id="autotuning-with-micro-tvm">
<span id="tutorial-micro-autotune"></span><span id="sphx-glr-how-to-work-with-microtvm-micro-autotune-py"></span><h1>Autotuning with micro TVM<a class="headerlink" href="#autotuning-with-micro-tvm" title="永久链接至标题">¶</a></h1>
<p><strong>Authors</strong>:
<a class="reference external" href="https://github.com/areusch">Andrew Reusch</a>,
<a class="reference external" href="https://github.com/mehrdadh">Mehrdad Hessar</a></p>
<p>This tutorial explains how to autotune a model using the C runtime.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
<span class="kn">import</span> <span class="nn">subprocess</span>
<span class="kn">import</span> <span class="nn">pathlib</span>

<span class="kn">import</span> <span class="nn">tvm</span>
</pre></div>
</div>
<div class="section" id="defining-the-model">
<h2>Defining the model<a class="headerlink" href="#defining-the-model" title="永久链接至标题">¶</a></h2>
<blockquote>
<div><p>To begin with, define a model in Relay to be executed on-device. Then create an IRModule from relay model and
fill parameters with random numbers.</p>
</div></blockquote>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">data_shape</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span>
<span class="n">weight_shape</span> <span class="o">=</span> <span class="p">(</span><span class="mi">6</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>

<span class="n">data</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">relay</span><span class="o">.</span><span class="n">var</span><span class="p">(</span><span class="s2">&quot;data&quot;</span><span class="p">,</span> <span class="n">tvm</span><span class="o">.</span><span class="n">relay</span><span class="o">.</span><span class="n">TensorType</span><span class="p">(</span><span class="n">data_shape</span><span class="p">,</span> <span class="s2">&quot;float32&quot;</span><span class="p">))</span>
<span class="n">weight</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">relay</span><span class="o">.</span><span class="n">var</span><span class="p">(</span><span class="s2">&quot;weight&quot;</span><span class="p">,</span> <span class="n">tvm</span><span class="o">.</span><span class="n">relay</span><span class="o">.</span><span class="n">TensorType</span><span class="p">(</span><span class="n">weight_shape</span><span class="p">,</span> <span class="s2">&quot;float32&quot;</span><span class="p">))</span>

<span class="n">y</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">relay</span><span class="o">.</span><span class="n">nn</span><span class="o">.</span><span class="n">conv2d</span><span class="p">(</span>
    <span class="n">data</span><span class="p">,</span>
    <span class="n">weight</span><span class="p">,</span>
    <span class="n">padding</span><span class="o">=</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">2</span><span class="p">),</span>
    <span class="n">kernel_size</span><span class="o">=</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="mi">5</span><span class="p">),</span>
    <span class="n">kernel_layout</span><span class="o">=</span><span class="s2">&quot;OIHW&quot;</span><span class="p">,</span>
    <span class="n">out_dtype</span><span class="o">=</span><span class="s2">&quot;float32&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">f</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">relay</span><span class="o">.</span><span class="n">Function</span><span class="p">([</span><span class="n">data</span><span class="p">,</span> <span class="n">weight</span><span class="p">],</span> <span class="n">y</span><span class="p">)</span>

<span class="n">relay_mod</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">IRModule</span><span class="o">.</span><span class="n">from_expr</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
<span class="n">relay_mod</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">relay</span><span class="o">.</span><span class="n">transform</span><span class="o">.</span><span class="n">InferType</span><span class="p">()(</span><span class="n">relay_mod</span><span class="p">)</span>

<span class="n">weight_sample</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">rand</span><span class="p">(</span>
    <span class="n">weight_shape</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">weight_shape</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">weight_shape</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span> <span class="n">weight_shape</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span>
<span class="p">)</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="s2">&quot;float32&quot;</span><span class="p">)</span>
<span class="n">params</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;weight&quot;</span><span class="p">:</span> <span class="n">weight_sample</span><span class="p">}</span>
</pre></div>
</div>
</div>
<div class="section" id="defining-the-target">
<h2>Defining the target #<a class="headerlink" href="#defining-the-target" title="永久链接至标题">¶</a></h2>
<blockquote>
<div><p>Now we define the TVM target that describes the execution environment. This looks very similar
to target definitions from other microTVM tutorials.</p>
<p>When running on physical hardware, choose a target and a board that
describe the hardware. There are multiple hardware targets that could be selected from
PLATFORM list in this tutorial. You can chose the platform by passing –platform argument when running
this tutorial.</p>
</div></blockquote>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">TARGET</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">target</span><span class="o">.</span><span class="n">target</span><span class="o">.</span><span class="n">micro</span><span class="p">(</span><span class="s2">&quot;host&quot;</span><span class="p">)</span>

<span class="c1"># Compiling for physical hardware</span>
<span class="c1"># --------------------------------------------------------------------------</span>
<span class="c1">#  When running on physical hardware, choose a TARGET and a BOARD that describe the hardware. The</span>
<span class="c1">#  STM32L4R5ZI Nucleo target and board is chosen in the example below.</span>
<span class="c1">#</span>
<span class="c1">#    TARGET = tvm.target.target.micro(&quot;stm32l4r5zi&quot;)</span>
<span class="c1">#    BOARD = &quot;nucleo_l4r5zi&quot;</span>
</pre></div>
</div>
</div>
<div class="section" id="extracting-tuning-tasks">
<h2>Extracting tuning tasks<a class="headerlink" href="#extracting-tuning-tasks" title="永久链接至标题">¶</a></h2>
<blockquote>
<div><p>Not all operators in the Relay program printed above can be tuned. Some are so trivial that only
a single implementation is defined; others don’t make sense as tuning tasks. Using
<cite>extract_from_program</cite>, you can produce a list of tunable tasks.</p>
<p>Because task extraction involves running the compiler, we first configure the compiler’s
transformation passes; we’ll apply the same configuration later on during autotuning.</p>
</div></blockquote>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">pass_context</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">transform</span><span class="o">.</span><span class="n">PassContext</span><span class="p">(</span><span class="n">opt_level</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">config</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;tir.disable_vectorize&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">})</span>
<span class="k">with</span> <span class="n">pass_context</span><span class="p">:</span>
    <span class="n">tasks</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">autotvm</span><span class="o">.</span><span class="n">task</span><span class="o">.</span><span class="n">extract_from_program</span><span class="p">(</span><span class="n">relay_mod</span><span class="p">[</span><span class="s2">&quot;main&quot;</span><span class="p">],</span> <span class="p">{},</span> <span class="n">TARGET</span><span class="p">)</span>
<span class="k">assert</span> <span class="nb">len</span><span class="p">(</span><span class="n">tasks</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span>
</pre></div>
</div>
</div>
<div class="section" id="configuring-microtvm">
<h2>Configuring microTVM<a class="headerlink" href="#configuring-microtvm" title="永久链接至标题">¶</a></h2>
<blockquote>
<div><p>Before autotuning, we need to define a module loader and then pass that to
a <cite>tvm.autotvm.LocalBuilder</cite>. Then we create a <cite>tvm.autotvm.LocalRunner</cite> and use
both builder and runner to generates multiple measurements for auto tunner.</p>
<p>In this tutorial, we have the option to use x86 host as an example or use different targets
from Zephyr RTOS. If you choose pass <cite>–platform=host</cite> to this tutorial it will uses x86. You can
choose other options by choosing from <cite>PLATFORM</cite> list.</p>
</div></blockquote>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">repo_root</span> <span class="o">=</span> <span class="n">pathlib</span><span class="o">.</span><span class="n">Path</span><span class="p">(</span>
    <span class="n">subprocess</span><span class="o">.</span><span class="n">check_output</span><span class="p">([</span><span class="s2">&quot;git&quot;</span><span class="p">,</span> <span class="s2">&quot;rev-parse&quot;</span><span class="p">,</span> <span class="s2">&quot;--show-toplevel&quot;</span><span class="p">],</span> <span class="n">encoding</span><span class="o">=</span><span class="s2">&quot;utf-8&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
<span class="p">)</span>

<span class="n">module_loader</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">micro</span><span class="o">.</span><span class="n">AutoTvmModuleLoader</span><span class="p">(</span>
    <span class="n">template_project_dir</span><span class="o">=</span><span class="n">repo_root</span> <span class="o">/</span> <span class="s2">&quot;src&quot;</span> <span class="o">/</span> <span class="s2">&quot;runtime&quot;</span> <span class="o">/</span> <span class="s2">&quot;crt&quot;</span> <span class="o">/</span> <span class="s2">&quot;host&quot;</span><span class="p">,</span>
    <span class="n">project_options</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;verbose&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">},</span>
<span class="p">)</span>
<span class="n">builder</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">autotvm</span><span class="o">.</span><span class="n">LocalBuilder</span><span class="p">(</span>
    <span class="n">n_parallel</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
    <span class="n">build_kwargs</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;build_option&quot;</span><span class="p">:</span> <span class="p">{</span><span class="s2">&quot;tir.disable_vectorize&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">}},</span>
    <span class="n">do_fork</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
    <span class="n">build_func</span><span class="o">=</span><span class="n">tvm</span><span class="o">.</span><span class="n">micro</span><span class="o">.</span><span class="n">autotvm_build_func</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">runner</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">autotvm</span><span class="o">.</span><span class="n">LocalRunner</span><span class="p">(</span><span class="n">number</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">repeat</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="mi">100</span><span class="p">,</span> <span class="n">module_loader</span><span class="o">=</span><span class="n">module_loader</span><span class="p">)</span>

<span class="n">measure_option</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">autotvm</span><span class="o">.</span><span class="n">measure_option</span><span class="p">(</span><span class="n">builder</span><span class="o">=</span><span class="n">builder</span><span class="p">,</span> <span class="n">runner</span><span class="o">=</span><span class="n">runner</span><span class="p">)</span>

<span class="c1"># Compiling for physical hardware</span>
<span class="c1"># --------------------------------------------------------------------------</span>
<span class="c1">#    module_loader = tvm.micro.AutoTvmModuleLoader(</span>
<span class="c1">#        template_project_dir=repo_root / &quot;apps&quot; / &quot;microtvm&quot; / &quot;zephyr&quot; / &quot;template_project&quot;,</span>
<span class="c1">#        project_options={</span>
<span class="c1">#            &quot;zephyr_board&quot;: BOARD,</span>
<span class="c1">#            &quot;west_cmd&quot;: &quot;west&quot;,</span>
<span class="c1">#            &quot;verbose&quot;: False,</span>
<span class="c1">#            &quot;project_type&quot;: &quot;host_driven&quot;,</span>
<span class="c1">#        },</span>
<span class="c1">#    )</span>
<span class="c1">#    builder = tvm.autotvm.LocalBuilder(</span>
<span class="c1">#        n_parallel=1,</span>
<span class="c1">#        build_kwargs={&quot;build_option&quot;: {&quot;tir.disable_vectorize&quot;: True}},</span>
<span class="c1">#        do_fork=False,</span>
<span class="c1">#        build_func=tvm.micro.autotvm_build_func,</span>
<span class="c1">#    )</span>
<span class="c1">#    runner = tvm.autotvm.LocalRunner(number=1, repeat=1, timeout=100, module_loader=module_loader)</span>
<span class="c1">#</span>
<span class="c1">#    measure_option = tvm.autotvm.measure_option(builder=builder, runner=runner)</span>

<span class="c1">################</span>
<span class="c1"># Run Autotuning</span>
<span class="c1">################</span>
<span class="c1"># Now we can run autotuning separately on each extracted task.</span>

<span class="n">num_trials</span> <span class="o">=</span> <span class="mi">10</span>
<span class="k">for</span> <span class="n">task</span> <span class="ow">in</span> <span class="n">tasks</span><span class="p">:</span>
    <span class="n">tuner</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">autotvm</span><span class="o">.</span><span class="n">tuner</span><span class="o">.</span><span class="n">GATuner</span><span class="p">(</span><span class="n">task</span><span class="p">)</span>
    <span class="n">tuner</span><span class="o">.</span><span class="n">tune</span><span class="p">(</span>
        <span class="n">n_trial</span><span class="o">=</span><span class="n">num_trials</span><span class="p">,</span>
        <span class="n">measure_option</span><span class="o">=</span><span class="n">measure_option</span><span class="p">,</span>
        <span class="n">callbacks</span><span class="o">=</span><span class="p">[</span>
            <span class="n">tvm</span><span class="o">.</span><span class="n">autotvm</span><span class="o">.</span><span class="n">callback</span><span class="o">.</span><span class="n">log_to_file</span><span class="p">(</span><span class="s2">&quot;microtvm_autotune.log.txt&quot;</span><span class="p">),</span>
            <span class="n">tvm</span><span class="o">.</span><span class="n">autotvm</span><span class="o">.</span><span class="n">callback</span><span class="o">.</span><span class="n">progress_bar</span><span class="p">(</span><span class="n">num_trials</span><span class="p">,</span> <span class="n">si_prefix</span><span class="o">=</span><span class="s2">&quot;M&quot;</span><span class="p">),</span>
        <span class="p">],</span>
        <span class="n">si_prefix</span><span class="o">=</span><span class="s2">&quot;M&quot;</span><span class="p">,</span>
    <span class="p">)</span>
</pre></div>
</div>
</div>
<div class="section" id="timing-the-untuned-program">
<h2>Timing the untuned program<a class="headerlink" href="#timing-the-untuned-program" title="永久链接至标题">¶</a></h2>
<blockquote>
<div><p>For comparison, let’s compile and run the graph without imposing any autotuning schedules. TVM
will select a randomly-tuned implementation for each operator, which should not perform as well as
the tuned operator.</p>
</div></blockquote>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">with</span> <span class="n">pass_context</span><span class="p">:</span>
    <span class="n">lowered</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">relay</span><span class="o">.</span><span class="n">build</span><span class="p">(</span><span class="n">relay_mod</span><span class="p">,</span> <span class="n">target</span><span class="o">=</span><span class="n">TARGET</span><span class="p">,</span> <span class="n">params</span><span class="o">=</span><span class="n">params</span><span class="p">)</span>

<span class="n">temp_dir</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">contrib</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">tempdir</span><span class="p">()</span>

<span class="n">project</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">micro</span><span class="o">.</span><span class="n">generate_project</span><span class="p">(</span>
    <span class="nb">str</span><span class="p">(</span><span class="n">repo_root</span> <span class="o">/</span> <span class="s2">&quot;src&quot;</span> <span class="o">/</span> <span class="s2">&quot;runtime&quot;</span> <span class="o">/</span> <span class="s2">&quot;crt&quot;</span> <span class="o">/</span> <span class="s2">&quot;host&quot;</span><span class="p">),</span>
    <span class="n">lowered</span><span class="p">,</span>
    <span class="n">temp_dir</span> <span class="o">/</span> <span class="s2">&quot;project&quot;</span><span class="p">,</span>
    <span class="p">{</span><span class="s2">&quot;verbose&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">},</span>
<span class="p">)</span>

<span class="c1"># Compiling for physical hardware</span>
<span class="c1"># --------------------------------------------------------------------------</span>
<span class="c1">#    project = tvm.micro.generate_project(</span>
<span class="c1">#        str(repo_root / &quot;apps&quot; / &quot;microtvm&quot; / &quot;zephyr&quot; / &quot;template_project&quot;),</span>
<span class="c1">#        lowered,</span>
<span class="c1">#        temp_dir / &quot;project&quot;,</span>
<span class="c1">#        {</span>
<span class="c1">#            &quot;zephyr_board&quot;: BOARD,</span>
<span class="c1">#            &quot;west_cmd&quot;: &quot;west&quot;,</span>
<span class="c1">#            &quot;verbose&quot;: False,</span>
<span class="c1">#            &quot;project_type&quot;: &quot;host_driven&quot;,</span>
<span class="c1">#        },</span>
<span class="c1">#    )</span>

<span class="n">project</span><span class="o">.</span><span class="n">build</span><span class="p">()</span>
<span class="n">project</span><span class="o">.</span><span class="n">flash</span><span class="p">()</span>
<span class="k">with</span> <span class="n">tvm</span><span class="o">.</span><span class="n">micro</span><span class="o">.</span><span class="n">Session</span><span class="p">(</span><span class="n">project</span><span class="o">.</span><span class="n">transport</span><span class="p">())</span> <span class="k">as</span> <span class="n">session</span><span class="p">:</span>
    <span class="n">debug_module</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">micro</span><span class="o">.</span><span class="n">create_local_debug_executor</span><span class="p">(</span>
        <span class="n">lowered</span><span class="o">.</span><span class="n">get_graph_json</span><span class="p">(),</span> <span class="n">session</span><span class="o">.</span><span class="n">get_system_lib</span><span class="p">(),</span> <span class="n">session</span><span class="o">.</span><span class="n">device</span>
    <span class="p">)</span>
    <span class="n">debug_module</span><span class="o">.</span><span class="n">set_input</span><span class="p">(</span><span class="o">**</span><span class="n">lowered</span><span class="o">.</span><span class="n">get_params</span><span class="p">())</span>
    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;########## Build without Autotuning ##########&quot;</span><span class="p">)</span>
    <span class="n">debug_module</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
    <span class="k">del</span> <span class="n">debug_module</span>
</pre></div>
</div>
<p class="sphx-glr-script-out">输出:</p>
<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>########## Build without Autotuning ##########
Node Name                                     Ops                                           Time(us)  Time(%)  Shape              Inputs  Outputs
---------                                     ---                                           --------  -------  -----              ------  -------
tvmgen_default_fused_nn_contrib_conv2d_NCHWc  tvmgen_default_fused_nn_contrib_conv2d_NCHWc  949.5     98.191   (1, 2, 10, 10, 3)  2       1
tvmgen_default_fused_layout_transform         tvmgen_default_fused_layout_transform         12.725    1.316    (1, 6, 10, 10)     1       1
tvmgen_default_fused_layout_transform_1       tvmgen_default_fused_layout_transform_1       4.767     0.493    (1, 1, 10, 10, 3)  1       1
Total_time                                    -                                             966.992   -        -                  -       -
</pre></div>
</div>
</div>
<div class="section" id="timing-the-tuned-program">
<h2>Timing the tuned program<a class="headerlink" href="#timing-the-tuned-program" title="永久链接至标题">¶</a></h2>
<blockquote>
<div><p>Once autotuning completes, you can time execution of the entire program using the Debug Runtime:</p>
</div></blockquote>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">with</span> <span class="n">tvm</span><span class="o">.</span><span class="n">autotvm</span><span class="o">.</span><span class="n">apply_history_best</span><span class="p">(</span><span class="s2">&quot;microtvm_autotune.log.txt&quot;</span><span class="p">):</span>
    <span class="k">with</span> <span class="n">pass_context</span><span class="p">:</span>
        <span class="n">lowered_tuned</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">relay</span><span class="o">.</span><span class="n">build</span><span class="p">(</span><span class="n">relay_mod</span><span class="p">,</span> <span class="n">target</span><span class="o">=</span><span class="n">TARGET</span><span class="p">,</span> <span class="n">params</span><span class="o">=</span><span class="n">params</span><span class="p">)</span>

<span class="n">temp_dir</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">contrib</span><span class="o">.</span><span class="n">utils</span><span class="o">.</span><span class="n">tempdir</span><span class="p">()</span>

<span class="n">project</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">micro</span><span class="o">.</span><span class="n">generate_project</span><span class="p">(</span>
    <span class="nb">str</span><span class="p">(</span><span class="n">repo_root</span> <span class="o">/</span> <span class="s2">&quot;src&quot;</span> <span class="o">/</span> <span class="s2">&quot;runtime&quot;</span> <span class="o">/</span> <span class="s2">&quot;crt&quot;</span> <span class="o">/</span> <span class="s2">&quot;host&quot;</span><span class="p">),</span>
    <span class="n">lowered_tuned</span><span class="p">,</span>
    <span class="n">temp_dir</span> <span class="o">/</span> <span class="s2">&quot;project&quot;</span><span class="p">,</span>
    <span class="p">{</span><span class="s2">&quot;verbose&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">},</span>
<span class="p">)</span>

<span class="c1"># Compiling for physical hardware</span>
<span class="c1"># --------------------------------------------------------------------------</span>
<span class="c1">#    project = tvm.micro.generate_project(</span>
<span class="c1">#        str(repo_root / &quot;apps&quot; / &quot;microtvm&quot; / &quot;zephyr&quot; / &quot;template_project&quot;),</span>
<span class="c1">#        lowered_tuned,</span>
<span class="c1">#        temp_dir / &quot;project&quot;,</span>
<span class="c1">#        {</span>
<span class="c1">#            &quot;zephyr_board&quot;: BOARD,</span>
<span class="c1">#            &quot;west_cmd&quot;: &quot;west&quot;,</span>
<span class="c1">#            &quot;verbose&quot;: False,</span>
<span class="c1">#            &quot;project_type&quot;: &quot;host_driven&quot;,</span>
<span class="c1">#        },</span>
<span class="c1">#    )</span>

<span class="n">project</span><span class="o">.</span><span class="n">build</span><span class="p">()</span>
<span class="n">project</span><span class="o">.</span><span class="n">flash</span><span class="p">()</span>
<span class="k">with</span> <span class="n">tvm</span><span class="o">.</span><span class="n">micro</span><span class="o">.</span><span class="n">Session</span><span class="p">(</span><span class="n">project</span><span class="o">.</span><span class="n">transport</span><span class="p">())</span> <span class="k">as</span> <span class="n">session</span><span class="p">:</span>
    <span class="n">debug_module</span> <span class="o">=</span> <span class="n">tvm</span><span class="o">.</span><span class="n">micro</span><span class="o">.</span><span class="n">create_local_debug_executor</span><span class="p">(</span>
        <span class="n">lowered_tuned</span><span class="o">.</span><span class="n">get_graph_json</span><span class="p">(),</span> <span class="n">session</span><span class="o">.</span><span class="n">get_system_lib</span><span class="p">(),</span> <span class="n">session</span><span class="o">.</span><span class="n">device</span>
    <span class="p">)</span>
    <span class="n">debug_module</span><span class="o">.</span><span class="n">set_input</span><span class="p">(</span><span class="o">**</span><span class="n">lowered_tuned</span><span class="o">.</span><span class="n">get_params</span><span class="p">())</span>
    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;########## Build with Autotuning ##########&quot;</span><span class="p">)</span>
    <span class="n">debug_module</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
    <span class="k">del</span> <span class="n">debug_module</span>
</pre></div>
</div>
<p class="sphx-glr-script-out">输出:</p>
<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>########## Build with Autotuning ##########
Node Name                                     Ops                                           Time(us)  Time(%)  Shape              Inputs  Outputs
---------                                     ---                                           --------  -------  -----              ------  -------
tvmgen_default_fused_nn_contrib_conv2d_NCHWc  tvmgen_default_fused_nn_contrib_conv2d_NCHWc  210.0     98.002   (1, 6, 10, 10, 1)  2       1
tvmgen_default_fused_layout_transform         tvmgen_default_fused_layout_transform         2.819     1.316    (1, 6, 10, 10)     1       1
tvmgen_default_fused_layout_transform_1       tvmgen_default_fused_layout_transform_1       1.462     0.682    (1, 1, 10, 10, 3)  1       1
Total_time                                    -                                             214.282   -        -                  -       -
</pre></div>
</div>
<div class="sphx-glr-footer class sphx-glr-footer-example docutils container" id="sphx-glr-download-how-to-work-with-microtvm-micro-autotune-py">
<div class="sphx-glr-download docutils container">
<p><a class="reference download internal" download="" href="../../_downloads/9ccca8fd489a1486ac71b55a55c320c5/micro_autotune.py"><code class="xref download docutils literal notranslate"><span class="pre">Download</span> <span class="pre">Python</span> <span class="pre">source</span> <span class="pre">code:</span> <span class="pre">micro_autotune.py</span></code></a></p>
</div>
<div class="sphx-glr-download docutils container">
<p><a class="reference download internal" download="" href="../../_downloads/f83ba3df2d52f9b54cf141114359481a/micro_autotune.ipynb"><code class="xref download docutils literal notranslate"><span class="pre">Download</span> <span class="pre">Jupyter</span> <span class="pre">notebook:</span> <span class="pre">micro_autotune.ipynb</span></code></a></p>
</div>
</div>
<p class="sphx-glr-signature"><a class="reference external" href="https://sphinx-gallery.github.io">Gallery generated by Sphinx-Gallery</a></p>
</div>
</div>


           </div>
           
          </div>
          

<footer>

    <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
      
        <a href="micro_reference_vm.html" class="btn btn-neutral float-right" title="microTVM 虚拟机" accesskey="n" rel="next">下一个 <span class="fa fa-arrow-circle-right"></span></a>
      
      
        <a href="index.html" class="btn btn-neutral float-left" title="Work With microTVM" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> 上一个</a>
      
    </div>

<div id="button" class="backtop"><img src="../../_static//img/right.svg" alt="backtop"/> </div>
<section class="footerSec">
    <div class="footerHeader">
      <ul class="d-flex align-md-items-center justify-content-between flex-column flex-md-row">
        <li class="copywrite d-flex align-items-center">
          <h5 id="copy-right-info">© 2020 Apache Software Foundation | All right reserved</h5>
        </li>
      </ul>

    </div>

    <ul>
      <li class="footernote">Copyright © 2020 The Apache Software Foundation. Apache TVM, Apache, the Apache feather, and the Apache TVM project logo are either trademarks or registered trademarks of the Apache Software Foundation.</li>
    </ul>

</section>
</footer>
        </div>
      </div>

    </section>

  </div>
  

    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>

  </body>
  <script type="text/javascript">
      jQuery(function () {
          SphinxRtdTheme.Navigation.enable(true);
      });
  </script>

  
  
    
    <!-- Theme Analytics -->
    <script>
    (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
      (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
      m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
    })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');

    ga('create', 'UA-75982049-2', 'auto');
    ga('send', 'pageview');
    </script>

    
   

</body>
</html>